package cn.hh.hrm.service.impl;

import cn.hh.hrm.constant.CourseTypeConstant;
import cn.hh.hrm.domain.CourseType;
import cn.hh.hrm.mapper.CourseTypeMapper;
import cn.hh.hrm.service.ICourseTypeService;
import cn.hh.hrm.util.AjaxResult;
import cn.hh.hrm.vo.CrumbsVo;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.Caching;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * <p>
 * 课程目录 服务实现类
 * </p>
 *
 * @author terrylv
 * @since 2021-04-29
 */
//@Service
public class CourseTypeServiceImpl_springcache extends ServiceImpl<CourseTypeMapper, CourseType> implements ICourseTypeService {
    @Autowired
    private CourseTypeMapper typeMapper;
    @Autowired
    private RedisTemplate redisTemplate;
    /**
     * 第一次查询的时候  先判断缓存中是否存在  如果存在直接返回
     * 如果不存在  查询数据库  存入缓存  返回数据
     * @return
     */
    @Override
    @Cacheable(cacheNames = CourseTypeConstant.COURSE_TYPE_KEY,key = "'courseTree'")
    public AjaxResult treeData() {
        //循环的思想  一条sql语句 查出所有
        List<CourseType> data  = loadData();

        return AjaxResult.me().setResultObj(data);
    }

    @Override
    public List<CrumbsVo> crumbs(Long id) {
        return null;
    }

    @Override
    @CacheEvict(cacheNames = CourseTypeConstant.COURSE_TYPE_KEY,key = "'courseTree'")
    public boolean insert(CourseType entity) {
        //新增数据
        boolean insert = super.insert(entity);
        return insert;
    }

    @Override
    @CacheEvict(cacheNames = CourseTypeConstant.COURSE_TYPE_KEY,key = "'courseTree'")
    public boolean updateById(CourseType entity) {
        boolean update = super.updateById(entity);
        return update;
    }



    @Override
    @CacheEvict(cacheNames = CourseTypeConstant.COURSE_TYPE_KEY,key = "'courseTree'")
    public boolean deleteById(Serializable id) {
        boolean delete = super.deleteById(id);
        return delete;
    }



    private List<CourseType> loadData() {
        //准备用于封装数据数据的容器
        List<CourseType> result  = new ArrayList<>();
        //查询出所有的数据
        List<CourseType> types = typeMapper.selectList(null);
        //维护id与对象的关系
        HashMap<Long, CourseType> map = new HashMap<>();
        types.stream().forEach(type->{
            map.put(type.getId(), type);
        });
        //遍历集合 寻找第一级
        types.stream().forEach(courseType -> {
            //第一级的特点  pid = 0
            if(courseType.getPid() == 0){
                //先装入第一级
                result.add(courseType);
            }else {//寻找自己的父级  并将其添加到父级的children
                //拿到其父级的id
                Long pid = courseType.getPid();
                //根据pid到map中寻找id等于该pid的父级
                CourseType parent = map.get(pid);
                //再将自己放入父级的children中
                List<CourseType> children = parent.getChildren();
                children.add(courseType);
            }
        });
        return  result;
    }
}
